/* 
 * SIT, Sistema Integral de Tramites del Ministerio de Minas y Energia
 * Copyright 2010, como se indica en  los tags @author. Revise
 * el archivo  copyright.txt en la lista de desarrollo 
 * 
 * Este NO es un software libre y no puede ser redistribuido y/o modificado
 * bajo ningun termino. El codigo es propietario y solo  puede
 * ser utilizado bajo permiso explicito del Ministerio de Minas y Energia
 * 
 * Este Software no es distribuido publicamente y solo deberia estar
 * ejecutandose en el entorno de desarrollo del Ministerio de Minas y Energia,
 * si por alguna razon este codigo se ejecuta en un entorno diferente estaria 
 * violando la ley de derechos de autor que lo proteje., Al igual que cualquier 
 * uso  del codigo o cualquiera de los componentes del sistema
 * sin autorizacion explicita de los autores.
 * 
 * Si necesita autorizacion para la utilizacion del codigo o parte de el 
 * por favor refierase a la lista de desarrollo del proyecto para contactar 
 * al autor indicado en el tag @author, o comuniquese con 
 * el grupo de arquitectura de software del proyecto.
 */
package co.edu.udistrital.database.dao.api;

import java.io.Serializable;

import co.edu.udistrital.database.exceptions.CrudException;

/**
 * Servicio para operaciones de CRUD. Create - Retrieve - Update - Delete Provee
 * operaciones basicas: creacion, modificacion, eliminacion. Para operaciones de
 * consulta se usa el servicio Finder
 * 
 * @author <a href="mailto:rcabezas1@gmail.com">Edwin Romero</a>
 * @version $1.0
 */
public interface ICrud <T>{

	/**
	 * Persiste o actualiza una entidad. Si esta ya existe en la BD, 
	 * entonces actualiza su contenido.
	 * 
	 * @param entity Entidad a guardar
	 * @throws CrudException Si ocurre un error en el guardado
	 * @return La entidad guardada y actualizada
	 */
	Class<T> save(Class<T> entity) throws CrudException;

	/**
	 * Elimina entidad pasada por parametro.
	 * 
	 * @param entity Tipo de Entidad a borrar
	 * @param id Identificador de la entidad a borrar
	 * @throws CrudException Si ocurre un error en el guardado
	 */
	void delete(Serializable id) throws CrudException;

	/**
	 * recarga la entidad que se pasa por parametro
	 * 
	 * @param entity Entidad a recargar
	 * @throws CrudException Si ocurre un error en el guardado
	 * @return La entidad   actualizada
	 */
	Class<T> refresh(Class<T> entity) throws CrudException;
	 
		/**
		 * sincroniza la base de datos y la session
		 * 
		 * @throws CrudException 
		 */
	 void flush() throws CrudException;
}
